<script setup lang="ts">
import { ref, toRef } from 'vue'
import useAppStore from '@/store/index'

import Carousel from '@/components/Carousel/index.vue'
import Guess from '@/components/Guess/index.vue'
import Entries from './components/Entries/index.vue'
import {
  getHomeBanner,
  BannerItem,
  getHomeCategoryHeadMutli,
  CategoryItem,
  getHomeHotMutli,
  HotMutliItem,
  getHomeNew,
  NewItem,
} from '@/services/home'
import Skeleton from './components/Skeleton/index.vue'
import { useGuessList } from '@/composable'

// pinia
const appStore = useAppStore()
const safeArea = toRef(appStore, 'safeArea')

// 初始数据
let hasMore = $ref(true)

// 跳转到搜索页面
const goSearch = () => {
  uni.navigateTo({ url: '/pages/search/index' })
}

// 扫描二维码
const scanCode = () => {
  uni.scanCode({ scanType: ['qrCode'] })
}

// 消息提示
const nextVersion = () => {
  uni.showToast({ title: '等待下一个版本哦~', icon: 'none' })
}

// ------------------ 自己写的代码 ----------------------------
const bannerList = ref<BannerItem[]>([])
const categoryList = ref<CategoryItem[]>([])
const hotList = ref<HotMutliItem[]>([])
const newList = ref<NewItem[]>([])
const isLoading = ref(true)

const { counts, getGuessList, guessList, onScrolltolower, page } =
  useGuessList()
// 通过封装的 http 通用函数发请求
const loadData = async () => {
  // 🚨 同级多个 await 会让请求按顺序执行，其实这里不需要按顺序执行
  // // 调用封装的接口，获取轮播图数据
  // bannerList.value = await getHomeBanner()
  // // 调用封装的接口，获取首页类目数据
  // categoryList.value = await getHomeCategoryHeadMutli()
  // // 调用封装的接口，获取推荐专区数据
  // hotList.value = await getHomeHotMutli()
  // // 调用封装的接口，获取新鲜好物数据
  // newList.value = await getHomeNew()
  // 👍 通过 Promise.all 让所有请求同时发送
  isLoading.value = true
  const res = await Promise.all([
    getHomeBanner(),
    getHomeCategoryHeadMutli(),
    getHomeHotMutli(),
    getHomeNew(),
  ])
  isLoading.value = false
  // 使用数据
  bannerList.value = res[0]
  categoryList.value = res[1]
  hotList.value = res[2]
  newList.value = res[3]
  // 猜你喜欢
  getGuessList()
}
loadData()

// 通过 scroll-view 实现下拉刷新
//  - 配置 refresher-enabled 属性，开启下拉刷新交互
//  - 监听 refresherrefresh 事件，判断用户是否执行了下拉操作
//  - 配置 refresher-triggered 属性，关闭下拉状态
const triggered = ref(false)
// 查找文档：自定义下拉刷新被触发事件
const onRefresherrefresh = async () => {
  // 开启下拉刷新状态
  triggered.value = true
  // 清空页面数据
  bannerList.value = []
  categoryList.value = []
  hotList.value = []
  newList.value = []
  guessList.value = []
  // 分页的页码重置为 1
  page.value = 1
  // 重新加载数据
  await loadData()
  // 关闭下拉刷新状态
  triggered.value = false
}
</script>

<template>
  <!-- 导航条 -->
  <view class="navbar" :style="{ paddingTop: safeArea?.top + 'px' }">
    <!-- 文字logo -->
    <view class="logo">
      <image
        src="https://static.botue.com/erabbit/static/images/logo.png"
      ></image>
      <text>新鲜 · 亲民 · 快捷</text>
    </view>
    <!-- 搜索条 -->
    <view class="search" @click="goSearch">
      <text class="icon-search">搜索商品</text>
      <text class="icon-scan" @click="scanCode"></text>
    </view>
  </view>

  <Skeleton v-if="isLoading" />

  <scroll-view
    v-else
    class="viewport"
    scroll-y
    refresher-enabled
    enable-back-to-top
    enhanced
    refresher-background="#f7f7f8"
    :show-scrollbar="false"
    @scrolltolower="onScrolltolower"
    @refresherrefresh="onRefresherrefresh"
    :refresher-triggered="triggered"
  >
    <!-- 焦点图 -->
    <Carousel style="height: 280rpx" :source="bannerList"></Carousel>
    <!-- 前台类目 -->
    <Entries :source="categoryList"></Entries>
    <!-- 推荐专区 -->
    <view class="panel recommend">
      <view class="item" v-for="item in hotList" :key="item.id">
        <view class="title">
          {{ item.title }}<text>{{ item.alt }}</text>
        </view>
        <navigator
          hover-class="none"
          :url="`/pages/recommend/index?type=${item.type}`"
          class="cards"
        >
          <image
            mode="aspectFit"
            v-for="img in item.pictures"
            :key="img"
            :src="img"
          ></image>
        </navigator>
      </view>
    </view>
    <!-- 新鲜好物 -->
    <view class="panel fresh">
      <view class="title">
        新鲜好物
        <navigator
          hover-class="none"
          class="more"
          url="/pages/recommend/index?type=5"
          >更多</navigator
        >
      </view>
      <view class="cards">
        <navigator
          hover-class="none"
          :url="`/pages/goods/index?id=${item.id}`"
          v-for="item in newList"
          :key="item.id"
        >
          <image mode="aspectFit" :src="item.picture"></image>
          <view class="name">{{ item.name }}</view>
          <view class="price">
            <text class="small">¥</text>{{ item.price }}
          </view>
        </navigator>
      </view>
    </view>
    <!-- 热门品牌 -->
    <view class="panel brands">
      <view class="title">
        热门品牌
        <navigator hover-class="none" class="more" url="/pages/list/index"
          >更多</navigator
        >
      </view>
      <view class="cards">
        <navigator hover-class="none" url="/pages/goods/index">
          <image
            mode="aspectFit"
            src="https://static.botue.com/erabbit/static/uploads/brand_logo_1.jpg"
          ></image>
          <view class="name">小米</view>
          <view class="price">99元起</view>
        </navigator>
        <navigator hover-class="none" url="/pages/goods/index">
          <image
            mode="aspectFit"
            src="https://static.botue.com/erabbit/static/uploads/brand_logo_2.jpg"
          ></image>
          <view class="name">TCL</view>
          <view class="price">199起</view>
        </navigator>
        <navigator hover-class="none" url="/pages/goods/index">
          <image
            mode="aspectFit"
            src="https://static.botue.com/erabbit/static/uploads/brand_logo_3.jpg"
          ></image>
          <view class="name">饭小宝</view>
          <view class="price">9.9起</view>
        </navigator>
        <navigator hover-class="none" url="/pages/goods/index">
          <image
            mode="aspectFit"
            src="https://static.botue.com/erabbit/static/uploads/brand_logo_4.jpg"
          ></image>
          <view class="name">鳄鱼</view>
          <view class="price">299起</view>
        </navigator>
      </view>
    </view>
    <!-- 专题 -->
    <view class="panel topic">
      <view class="title">
        专题
        <navigator hover-class="none" class="more" url="">更多</navigator>
      </view>
      <div class="cards">
        <navigator hover-class="none" url="">
          <image
            src="https://static.botue.com/erabbit/static/uploads/topic_1.jpg"
          ></image>
          <view class="name">忙里忙外，回家吃饭忙里忙外，回家吃饭</view>
          <view class="price"> <text>19.9元</text>起 </view>
          <view class="extra">
            <text space="ensp" class="icon-heart">1220</text>
            <text space="ensp" class="icon-preview">1000</text>
          </view>
        </navigator>
        <navigator hover-class="none" url="">
          <image
            src="https://static.botue.com/erabbit/static/uploads/topic_2.jpg"
          ></image>
          <view class="name">忙里忙外，回家吃饭</view>
          <view class="price"> <text>19.9元</text>起 </view>
          <view class="extra">
            <text space="ensp" class="icon-heart">1220</text>
            <text space="ensp" class="icon-preview">1000</text>
          </view>
        </navigator>
      </div>
    </view>
    <!-- 猜你喜欢 -->
    <Guess :source="guessList"></Guess>
    <view class="loading" v-if="counts !== guessList.length">正在加载...</view>
  </scroll-view>
</template>

<style>
page {
  height: 100%;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

/* 自定义导航条 */
.navbar {
  background-image: url(https://static.botue.com/erabbit/static/images/navigator_bg.png);
  background-size: cover;
  position: relative;
}

.navbar .logo {
  display: flex;
  align-items: center;
  height: 64rpx;
  padding-left: 30rpx;
}

.navbar .logo image {
  width: 166rpx;
  height: 39rpx;
}

.navbar .logo text {
  flex: 1;
  line-height: 28rpx;
  color: #fff;
  margin: 2rpx 0 0 20rpx;
  padding-left: 20rpx;
  border-left: 1rpx solid #fff;
  font-size: 26rpx;
}

.navbar .search {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 10rpx 0 26rpx;
  height: 64rpx;
  margin: 16rpx 20rpx;
  color: #fff;
  font-size: 28rpx;
  border-radius: 32rpx;
  background-color: rgba(255, 255, 255, 0.5);
}

.navbar .icon-search::before {
  margin-right: 10rpx;
}

.navbar .icon-scan {
  font-size: 30rpx;
  padding: 15rpx;
}

.viewport {
  background-color: #f7f7f8;
}

/* 焦点图 */
.banner {
  height: 280rpx;
  margin: 20rpx 20rpx 0;
}

/* 公共面板 */
.panel {
  margin: 20rpx 20rpx 0;
  border-radius: 10rpx;
  background-color: #fff;
}

.panel .title {
  display: flex;
  align-items: center;
  padding: 24rpx 24rpx 0;
  font-size: 32rpx;
  color: #262626;
  position: relative;
}

.panel .title text {
  font-size: 24rpx;
  color: #7f7f7f;
  margin-left: 18rpx;
}

.panel .more {
  position: absolute;
  right: 24rpx;
  font-size: 26rpx;
  color: #7f7f7f;
}

.panel .cards {
  display: flex;
}

.panel .name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* 推荐专区 */
.recommend {
  display: flex;
  flex-wrap: wrap;
  min-height: 508rpx;
}

.recommend .item {
  display: flex;
  flex-direction: column;

  width: 50%;
  height: 254rpx;
}

.recommend .item {
  border-right: 1rpx solid #eee;
  border-top: 1rpx solid #eee;
}

.recommend .item:nth-child(2n) {
  border-right: 0 none;
}

.recommend .item:nth-child(-n + 2) {
  border-top: 0 none;
}

.recommend .cards {
  flex: 1;
  padding: 15rpx 20rpx;
}

.recommend .cards navigator {
  width: 50%;
}

/* 新鲜好物 & 热门品牌 */
.fresh {
  min-height: 320rpx;
}

.fresh .cards navigator,
.brands .cards navigator {
  width: 25%;
  padding: 15rpx 20rpx 20rpx;
  line-height: 1;
  text-align: center;
}

.fresh image,
.brands image {
  width: 126rpx;
  height: 126rpx;
}

.fresh .name,
.brands .name {
  margin: 20rpx 0 16rpx;
  font-size: 24rpx;
  color: #262626;
}

.fresh .price {
  line-height: 1;
  text-align: left;
  font-size: 26rpx;
  color: #cf4444;
}

.fresh .small {
  font-size: 80%;
}

.brands .price {
  font-size: 24rpx;
  color: #999;
}

/* 专题 */
.topic .cards {
  justify-content: space-between;
  padding: 15rpx 20rpx 20rpx;
}

.topic .cards navigator {
  width: 325rpx;
  line-height: 1;
  flex: 0;
}

.topic image {
  width: 325rpx;
  height: 164rpx;
  border-radius: 4rpx;
}

.topic navigator > view {
  margin-top: 16rpx;
}

.topic .name {
  font-size: 26rpx;
  color: #262626;
}

.topic .price {
  font-size: 24rpx;
  color: #999;
}

.topic .price text {
  color: #cf4444;
}

.topic .extra {
  font-size: 22rpx;
  color: #666;
}

.topic .extra text {
  margin-right: 20rpx;
}

.topic .extra text::before {
  margin-right: 4rpx;
}

.topic .extra .icon-preview:before {
  font-size: 25rpx;
}
</style>
